package com.cencat.route.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.route.entity.Merchant;
import com.cencat.route.vo.MerchantVO;
import com.cencat.route.dto.MerchantDTO;
import com.cencat.route.dto.MerchantQueryDTO;
import com.cencat.route.dto.MerchantBatchUpdateDTO;
import com.cencat.route.dto.MerchantStatisticsDTO;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 商户管理服务接口
 * 提供商户的增删改查、统计分析、信用评估、业务分析等功能
 * 
 * @author cencat
 * @version 1.0
 * @since 2025-01-20
 */
public interface MerchantService {

    /**
     * 分页查询商户列表
     * 
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    Page<MerchantVO> getMerchantList(Page<Merchant> page, MerchantQueryDTO queryDTO);

    /**
     * 根据ID获取商户详情
     * 
     * @param id 商户ID
     * @return 商户详情
     */
    MerchantVO getMerchantById(@NotNull Long id);

    /**
     * 创建新商户
     * 
     * @param merchantDTO 商户信息
     * @return 创建结果
     */
    Boolean createMerchant(@NotNull MerchantDTO merchantDTO);

    /**
     * 更新商户信息
     * 
     * @param id 商户ID
     * @param merchantDTO 商户信息
     * @return 更新结果
     */
    Boolean updateMerchant(@NotNull Long id, @NotNull MerchantDTO merchantDTO);

    /**
     * 删除商户
     * 
     * @param id 商户ID
     * @return 删除结果
     */
    Boolean deleteMerchant(@NotNull Long id);

    /**
     * 批量删除商户
     * 
     * @param ids 商户ID列表
     * @return 删除结果
     */
    Boolean batchDeleteMerchants(@NotNull List<Long> ids);

    /**
     * 批量更新商户状态
     * 
     * @param batchUpdateDTO 批量更新参数
     * @return 更新结果
     */
    Boolean batchUpdateMerchantStatus(@NotNull MerchantBatchUpdateDTO batchUpdateDTO);

    /**
     * 批量更新商户信用等级
     * 
     * @param ids 商户ID列表
     * @param creditLevel 信用等级
     * @return 更新结果
     */
    Boolean batchUpdateCreditLevel(@NotNull List<Long> ids, @NotNull String creditLevel);

    /**
     * 批量更新服务费率
     * 
     * @param ids 商户ID列表
     * @param serviceRate 服务费率
     * @return 更新结果
     */
    Boolean batchUpdateServiceRate(@NotNull List<Long> ids, @NotNull Double serviceRate);

    /**
     * 批量更新结算周期
     * 
     * @param ids 商户ID列表
     * @param settlementCycle 结算周期
     * @return 更新结果
     */
    Boolean batchUpdateSettlementCycle(@NotNull List<Long> ids, @NotNull Integer settlementCycle);

    /**
     * 获取商户统计信息
     * 
     * @param statisticsDTO 统计参数
     * @return 统计结果
     */
    Map<String, Object> getMerchantStatistics(@NotNull MerchantStatisticsDTO statisticsDTO);

    /**
     * 获取活跃商户
     * 
     * @param limit 数量限制
     * @return 活跃商户列表
     */
    List<MerchantVO> getActiveMerchants(@NotNull Integer limit);

    /**
     * 获取新注册商户
     * 
     * @param days 天数
     * @param limit 数量限制
     * @return 新注册商户列表
     */
    List<MerchantVO> getNewRegisteredMerchants(@NotNull Integer days, @NotNull Integer limit);

    /**
     * 获取高信用商户
     * 
     * @param minCreditScore 最低信用分数
     * @param limit 数量限制
     * @return 高信用商户列表
     */
    List<MerchantVO> getHighCreditMerchants(@NotNull Integer minCreditScore, @NotNull Integer limit);

    /**
     * 获取待审核商户
     * 
     * @param limit 数量限制
     * @return 待审核商户列表
     */
    List<MerchantVO> getPendingMerchants(@NotNull Integer limit);

    /**
     * 获取已认证商户
     * 
     * @param limit 数量限制
     * @return 已认证商户列表
     */
    List<MerchantVO> getVerifiedMerchants(@NotNull Integer limit);

    /**
     * 获取区域商户
     * 
     * @param areaCode 区域编码
     * @param status 状态
     * @param limit 数量限制
     * @return 区域商户列表
     */
    List<MerchantVO> getAreaMerchants(@NotNull String areaCode, String status, @NotNull Integer limit);

    /**
     * 获取行业商户
     * 
     * @param industryCode 行业编码
     * @param status 状态
     * @param limit 数量限制
     * @return 行业商户列表
     */
    List<MerchantVO> getIndustryMerchants(@NotNull String industryCode, String status, @NotNull Integer limit);

    /**
     * 智能推荐合作商户
     * 
     * @param merchantId 商户ID
     * @param limit 数量限制
     * @return 推荐商户列表
     */
    List<MerchantVO> getRecommendedPartners(@NotNull Long merchantId, @NotNull Integer limit);

    /**
     * 检查商户是否存在
     * 
     * @param id 商户ID
     * @return 是否存在
     */
    Boolean existsById(@NotNull Long id);

    /**
     * 检查商户编号是否存在
     * 
     * @param merchantNo 商户编号
     * @param excludeId 排除的商户ID
     * @return 是否存在
     */
    Boolean existsByMerchantNo(@NotNull String merchantNo, Long excludeId);

    /**
     * 检查商户名称是否存在
     * 
     * @param merchantName 商户名称
     * @param excludeId 排除的商户ID
     * @return 是否存在
     */
    Boolean existsByMerchantName(@NotNull String merchantName, Long excludeId);

    /**
     * 检查统一社会信用代码是否存在
     * 
     * @param creditCode 统一社会信用代码
     * @param excludeId 排除的商户ID
     * @return 是否存在
     */
    Boolean existsByCreditCode(@NotNull String creditCode, Long excludeId);

    /**
     * 商户注册
     * 
     * @param merchantDTO 商户注册信息
     * @return 注册结果
     */
    Boolean registerMerchant(@NotNull MerchantDTO merchantDTO);

    /**
     * 商户认证
     * 
     * @param merchantId 商户ID
     * @param certificationData 认证资料
     * @return 认证结果
     */
    Boolean certifyMerchant(@NotNull Long merchantId, @NotNull Map<String, Object> certificationData);

    /**
     * 激活商户
     * 
     * @param merchantId 商户ID
     * @return 激活结果
     */
    Boolean activateMerchant(@NotNull Long merchantId);

    /**
     * 停用商户
     * 
     * @param merchantId 商户ID
     * @param reason 停用原因
     * @return 停用结果
     */
    Boolean deactivateMerchant(@NotNull Long merchantId, @NotNull String reason);

    /**
     * 冻结商户
     * 
     * @param merchantId 商户ID
     * @param reason 冻结原因
     * @param freezeDays 冻结天数
     * @return 冻结结果
     */
    Boolean freezeMerchant(@NotNull Long merchantId, @NotNull String reason, @NotNull Integer freezeDays);

    /**
     * 解冻商户
     * 
     * @param merchantId 商户ID
     * @return 解冻结果
     */
    Boolean unfreezeMerchant(@NotNull Long merchantId);

    /**
     * 审核商户
     * 
     * @param merchantId 商户ID
     * @param auditResult 审核结果
     * @param auditRemark 审核备注
     * @return 审核结果
     */
    Boolean auditMerchant(@NotNull Long merchantId, @NotNull String auditResult, String auditRemark);

    /**
     * 获取商户信用评估
     * 
     * @param merchantId 商户ID
     * @return 信用评估结果
     */
    Map<String, Object> getCreditAssessment(@NotNull Long merchantId);

    /**
     * 更新商户信用分数
     * 
     * @param merchantId 商户ID
     * @param creditScore 信用分数
     * @param reason 更新原因
     * @return 更新结果
     */
    Boolean updateCreditScore(@NotNull Long merchantId, @NotNull Integer creditScore, @NotNull String reason);

    /**
     * 获取商户业务分析
     * 
     * @param merchantId 商户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 业务分析结果
     */
    Map<String, Object> getBusinessAnalysis(@NotNull Long merchantId, @NotNull LocalDateTime startTime, 
                                             @NotNull LocalDateTime endTime);

    /**
     * 获取商户订单统计
     * 
     * @param merchantId 商户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单统计结果
     */
    Map<String, Object> getOrderStatistics(@NotNull Long merchantId, @NotNull LocalDateTime startTime, 
                                            @NotNull LocalDateTime endTime);

    /**
     * 获取商户收入统计
     * 
     * @param merchantId 商户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 收入统计结果
     */
    Map<String, Object> getRevenueStatistics(@NotNull Long merchantId, @NotNull LocalDateTime startTime, 
                                              @NotNull LocalDateTime endTime);

    /**
     * 获取商户服务评价
     * 
     * @param merchantId 商户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 服务评价统计
     */
    Map<String, Object> getServiceRating(@NotNull Long merchantId, @NotNull LocalDateTime startTime, 
                                          @NotNull LocalDateTime endTime);

    /**
     * 设置商户服务费率
     * 
     * @param merchantId 商户ID
     * @param serviceRate 服务费率
     * @param effectiveDate 生效日期
     * @return 设置结果
     */
    Boolean setServiceRate(@NotNull Long merchantId, @NotNull Double serviceRate, 
                           @NotNull LocalDateTime effectiveDate);

    /**
     * 设置商户结算周期
     * 
     * @param merchantId 商户ID
     * @param settlementCycle 结算周期(天)
     * @return 设置结果
     */
    Boolean setSettlementCycle(@NotNull Long merchantId, @NotNull Integer settlementCycle);

    /**
     * 商户结算
     * 
     * @param merchantId 商户ID
     * @param settlementPeriod 结算周期
     * @return 结算结果
     */
    Map<String, Object> settleMerchant(@NotNull Long merchantId, @NotNull String settlementPeriod);

    /**
     * 获取商户结算记录
     * 
     * @param merchantId 商户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param limit 数量限制
     * @return 结算记录列表
     */
    List<Map<String, Object>> getSettlementRecords(@NotNull Long merchantId, @NotNull LocalDateTime startTime, 
                                                    @NotNull LocalDateTime endTime, @NotNull Integer limit);

    /**
     * 导出商户数据
     * 
     * @param queryDTO 查询条件
     * @return 导出数据
     */
    List<MerchantVO> exportMerchants(@NotNull MerchantQueryDTO queryDTO);

    /**
     * 导入商户数据
     * 
     * @param merchants 商户数据列表
     * @return 导入结果
     */
    Boolean importMerchants(@NotNull List<MerchantDTO> merchants);

    /**
     * 商户数据同步
     * 
     * @param merchantId 商户ID
     * @param syncType 同步类型
     * @return 同步结果
     */
    Boolean syncMerchantData(@NotNull Long merchantId, @NotNull String syncType);

    /**
     * 批量商户数据同步
     * 
     * @param merchantIds 商户ID列表
     * @param syncType 同步类型
     * @return 同步结果
     */
    Boolean batchSyncMerchantData(@NotNull List<Long> merchantIds, @NotNull String syncType);
}